package ig.metrica.ui.modelo;

import ejb.metrica.matriz.correlacion.MatrizCorrelacionSBBean;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;

import javax.naming.NamingException;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;

import ig.finanzas.EspeciePK;
import ig.finanzas.ProductoPK;
import ig.finanzas.TasaPK;
import ig.finanzas.riesgo.FactorRiesgoMatrizCorrelacion;
import ig.metrica.origenesdedatos.OrigenDeDatosBean;
import ig.metrica.origenesdedatos.OrigenesdatosDTO;
import ig.metrica.riesgo.FactorRiesgoPersonalMetrica;
import ig.metrica.ui.PantallaSevinproPanel;
import ig.metrica.ui.ServiceLocator;
import ig.metrica.ui.modelo.modelotablas.ModeloTablaPAFC;
import ig.util.CellRenderSelectModel;
import java.util.Enumeration;
import java.util.ArrayList;
import java.util.List;


public class PantallaAsociacionFactorContrato extends PantallaSevinproPanel {
    
    //Componentes de la interfaz grafica
    private JTable tablaProductos;
    private Hashtable relacionProductosFactores;
    private JTable tablaEspecies;
    private Hashtable relacionEspeciesFactores;
    private Hashtable relacionEspeciesFactoresPantalla;
    private JComboBox comboTasas;
    private WizzardModelo wizzard=null;
    private JComboBox[] comboBoxsColumns=new JComboBox[1];    
    @Override
    public JComboBox[] getComboBoxsColumnsTable1() {
        return comboBoxsColumns;
    }

    private JComboBox[] comboBoxsColumnsTable2=new JComboBox[0];
    @Override
    public JComboBox[] getComboBoxsColumnsTable2() {
        return comboBoxsColumnsTable2;
    }

    //private JlEstadoModeo dmodelo;


//    private OrigenDeDatos origenTasa = null;
    public PantallaAsociacionFactorContrato(WizzardModelo wizzard,ThreadModelos threadModelos) throws RemoteException, NamingException, ClassNotFoundException, SQLException,ExceptionEnConsulta{
        this.wizzard=wizzard;
        this.datosbasicos=this.wizzard.datosbasicos;
        this.threadModelos =threadModelos;
        setFrame(this.wizzard.getFrame());
        this.datosbasicos=datosbasicos;
        JComboBox comboFactor = new JComboBox();
        comboFactor.addItem("PRECIO");
        comboFactor.addItem("TASA");
        comboFactor.addItem("TASA DE DESCUENTO");
        comboTasas = new JComboBox();
        TasaPK tasaPorDefecto = null;
        //Integer id=0;
        try {
            Collection ClibroCuentasProductos=new OrigenDeDatosBean().ejbFindByAll();
            ht.put("IDMODELO",this.threadModelos.getIdModelo());
            for (Object elem: ClibroCuentasProductos) {
                if(((OrigenesdatosDTO)elem).getEntidad().trim().equals("TASAS")){
                    //id=((OrigenesdatosDTO)elem).getId();
                    this.origenesdatsoOK.add(elem);
                    //ArrayList datos = ((OrigenesdatosDTO)elem).obtenerDatos(ht);
                    OrigenDeDatosBean origenDeDatosBean = new OrigenDeDatosBean();
                    origenDeDatosBean.setOrigenesdatosDTO((OrigenesdatosDTO)elem);
                    ArrayList datos = new OrigenDeDatosBean().obtenerDatos(ht);
                    int mapeoTasa = 0;//((OrigenDeDatos)elem).getArregloCampos().indexOf("NOMBRE");
                    Iterator i = datos.iterator();
                    while(i.hasNext()){
                        Object[] registro = (Object[])i.next();
                        TasaPK tasaPK = new TasaPK( registro[mapeoTasa].toString().trim());
                        if (tasaPorDefecto == null) tasaPorDefecto = tasaPK;
                        comboTasas.addItem( tasaPK );
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new ExceptionEnConsulta("No se pudo cargar las tasas Tasas.\n"+e); 
        }
        
        //-----------------------------------------------------------------------
        JPanel panelCentral;
        JPanel panelsuperior;
        JTabbedPane pestanas;
        
        setLayout( new BorderLayout() );
        
        add( panelCentral = new JPanel() , BorderLayout.CENTER );
        panelCentral.setLayout( new GridBagLayout() );
        
        panelCentral.add(pestanas= new JTabbedPane(),new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0) );
        
        pestanas.add( "Productos", new JScrollPane( tablaProductos = new JTable( new ModeloTablaPAFC( new Hashtable(), tasaPorDefecto) ) ) );
        pestanas.add( "Especies", new JScrollPane( tablaEspecies = new JTable( new ModeloTablaPAFC( new Hashtable(), tasaPorDefecto) ) ) );
        
        //-----------------------------------------------------------------------
        TableColumn prodFactor = tablaProductos.getColumnModel().getColumn(1);
        TableColumn espcFactor = tablaEspecies.getColumnModel().getColumn(1);
        prodFactor.setCellEditor( new DefaultCellEditor(comboFactor) );
        espcFactor.setCellEditor( new DefaultCellEditor(comboFactor) );
        
        TableColumn prodTasa = tablaProductos.getColumnModel().getColumn(2);
        TableColumn espcTasa = tablaEspecies.getColumnModel().getColumn(2);
        prodTasa.setCellEditor( new DefaultCellEditor(comboTasas) );
        espcTasa.setCellEditor( new DefaultCellEditor(comboTasas) );


        tablaEspecies.getTableHeader().setReorderingAllowed(false);
        tablaProductos.getTableHeader().setReorderingAllowed(false);
        
        tablaProductos.setComponentPopupMenu(EditarTabla);
        tablaEspecies.setComponentPopupMenu(EditarTabla);
        
        comboBoxsColumns=new JComboBox[2];
        comboBoxsColumns[0]=comboFactor;
        comboBoxsColumns[1]=comboTasas;

        tablaProductos.setDefaultRenderer(Object.class, new CellRenderSelectModel());
        tablaEspecies.setDefaultRenderer(Object.class, new CellRenderSelectModel());
    }
    
    public String getTitulo() {
        return "Definicion de Factores de Riesgo";
    }
    
    public void setModificable(boolean b) {
        tablaProductos.setEnabled(b);
        tablaEspecies.setEnabled(b);
        comboTasas.setEnabled(b);
    }
//    private OrigenDeDatos origenLibrosCuentas=null;
//    private OrigenDeDatos origenEspecies=null;
    public void limpiarCampos() throws ExceptionEnConsulta,Exception {
        object=null;
//        MatrizDTO matriz = null;
        Hashtable ht_=null;
        if(this.wizzard.getModelo().getIdmatriz()!=-1 && this.wizzard.getModelo().getIdmatriz()!=0){
            ht_=this.lookupMatrizCorrelacionSBBean().findById(this.wizzard.getModelo().getIdmatriz());
//            matriz = (MatrizDTO)ht_.get("DTO");
        }else{
            ht_=this.lookupMatrizCorrelacionSBBean().findById(1);
//            matriz = (MatrizDTO)ht_.get("DTO");
        }
        
//        if(this.wizzard.getModelo().getIdmatriz()!=-1 && this.wizzard.getModelo().getIdmatriz()!=0)
//            matriz = ServiceLocator.getInstancia().findMatrizCorrelacionById(this.wizzard.getModelo().getIdmatriz());
//        else
//            matriz = ServiceLocator.getInstancia().findMatrizCorrelacionById(1);
        FactorRiesgoMatrizCorrelacion frmc = (FactorRiesgoMatrizCorrelacion)new ArrayList( (Collection) ht_.get("FACTORES")  ).get( 0 );
        
        relacionProductosFactores = new Hashtable();
        relacionEspeciesFactores = new Hashtable();
        relacionEspeciesFactoresPantalla = new Hashtable();
        
        Collection ClibroCuentasProductos=new OrigenDeDatosBean().ejbFindByAll();
        ht_.put("IDMODELO",this.threadModelos.getIdModelo());

        //Agregado por Cristhiam Reina
        //30/08/2011
        System.out.println("LIBROS-CUENTAS-PRODUCTOS");

        for (Object elem: ClibroCuentasProductos) {
            if(((OrigenesdatosDTO)elem).getEntidad().trim().equals("LIBROS-CUENTAS-PRODUCTOS")){
                try{
                    origenesdatsoOK.add(elem);
                    OrigenDeDatosBean origenDeDatosBean = new OrigenDeDatosBean();
                    origenDeDatosBean.setOrigenesdatosDTO((OrigenesdatosDTO)elem);
                    
                    //ArrayList datos = ((OrigenesdatosDTO)elem).obtenerDatos(ht_);
                    ArrayList datos = origenDeDatosBean.obtenerDatos(ht_);
                    //ArrayList camposOrigenDeDatos = ((OrigenDeDatos)elem).getArregloCampos();
                    int mapeoLibro = 0;//camposOrigenDeDatos.indexOf("NOMBRE LIBRO");
                    int mapeoCuenta = 1;//camposOrigenDeDatos.indexOf("NOMBRE CUENTA");
                    int mapeoProducto = 2;//camposOrigenDeDatos.indexOf("NOMBRE PRODUCTO");
                    Iterator i = datos.iterator();
                    while (i.hasNext()){
                        Object[] registro = (Object[])i.next();
                        ProductoPK productoPK = new ProductoPK( registro[mapeoLibro].toString().trim(), registro[mapeoCuenta].toString(), registro[mapeoProducto].toString().trim() );
                        //Agregado por Cristhiam Reina
                        //30/08/2011
                        System.out.println(productoPK.toString());
                        relacionProductosFactores.put( productoPK, new FactorRiesgoPersonalMetrica(frmc, null) );
                    }
                } catch (Exception e) {
                    throw new ExceptionEnConsulta("Error tratando de Procesar los libros Cunetas Productos.\n"+e);
                }
            }else if(((OrigenesdatosDTO)elem).getEntidad().trim().equals("ESPECIES")){
                try{
                    origenesdatsoOK.add(elem);
                    OrigenDeDatosBean origenDeDatosBean = new OrigenDeDatosBean();
                    origenDeDatosBean.setOrigenesdatosDTO( ((OrigenesdatosDTO)elem) );
                    
                    ArrayList datos = origenDeDatosBean.obtenerDatos(ht_);
                    //ArrayList datos = ((OrigenesdatosDTO)elem).obtenerDatos(ht_);
                    //ArrayList camposOrigenDeDatos = ((OrigenDeDatos)elem).getArregloCampos();
                    int mapeoISIN = 1;//camposOrigenDeDatos.indexOf( "NOMBRE ESPECIE" );
                    int mapeoISIN1 = 0;//camposOrigenDeDatos.indexOf( "ISIN" );
                    Iterator i = datos.iterator();
                    while(i.hasNext()){
                        Object[] registro = (Object[])i.next();
                        EspeciePK especiePK = new EspeciePK(registro[mapeoISIN1].toString().trim());
                        relacionEspeciesFactores.put( especiePK, new FactorRiesgoPersonalMetrica(frmc, null) );
                        String nombreEspecie =registro[mapeoISIN].toString().trim();
                        relacionEspeciesFactoresPantalla.put(registro[mapeoISIN1].toString().trim(),nombreEspecie);
                    }
                } catch (Exception e) {
                    throw new ExceptionEnConsulta("Error tratando de Procesar las Especies.\n"+e);
                }
            }
        }
//        origenEspecies = ServiceLocator.getInstancia().getOrigenDatos("LIBROS-CUENTAS-PRODUCTOS");
//        ArrayList datos = origenLibrosCuentas.obtenerDatos(ht);
//        ArrayList camposOrigenDeDatos = origenLibrosCuentas.getArregloCampos();
//
//        int mapeoLibro = camposOrigenDeDatos.indexOf("NOMBRE LIBRO");
//        int mapeoCuenta = camposOrigenDeDatos.indexOf("NOMBRE CUENTA");
//        int mapeoProducto = camposOrigenDeDatos.indexOf("NOMBRE PRODUCTO");
//        Iterator i = datos.iterator();
//        while (i.hasNext()){
//            Object[] registro = (Object[])i.next();
//            ProductoPK productoPK = new ProductoPK( registro[mapeoLibro].toString(), registro[mapeoCuenta].toString(), registro[mapeoProducto].toString() );
//            relacionProductosFactores.put( productoPK, new FactorRiesgoPersonalMetrica(frmc, null) );
//        }
        
        
//        origenEspecies = ServiceLocator.getInstancia().getOrigenDatos("ESPECIES");
//        ArrayList datos = origenEspecies.obtenerDatos(ht);
//        ArrayList camposOrigenDeDatos = origenEspecies.getArregloCampos();
//        int mapeoISIN = camposOrigenDeDatos.indexOf( "NOMBRE ESPECIE" );
//        int mapeoISIN1 = camposOrigenDeDatos.indexOf( "ISIN" );
//
//        Iterator i = datos.iterator();
//        while(i.hasNext()){
//            Object[] registro = (Object[])i.next();
//            EspeciePK especiePK = new EspeciePK(registro[mapeoISIN1].toString());
//            relacionEspeciesFactores.put( especiePK, new FactorRiesgoPersonalMetrica(frmc, null) );
//            String nombreEspecie =registro[mapeoISIN].toString();
//            relacionEspeciesFactoresPantalla.put(registro[mapeoISIN1].toString(),nombreEspecie);
//        }
        
//                printHT(relacionProductosFactores,"relacionProductosFactores");
//                printHT(relacionEspeciesFactoresPantalla,"relacionEspeciesFactoresPantalla");
        ((ModeloTablaPAFC)tablaEspecies.getModel()).setRelacionFactoresPantalla(relacionEspeciesFactoresPantalla);
        
        this.wizzard.setRelacionProductosFactoresPantalla(relacionEspeciesFactoresPantalla);
        this.wizzard.setRelacionProductosFactores(relacionProductosFactores);
        
        setRelacionProductosFactores( relacionProductosFactores );
        setRelacionEspeciesFactores( relacionEspeciesFactores );
    }
    Collection origenesdatsoOK=new ArrayList();
    
    
    public Hashtable getRelacionEspeciesFactoresPantalla() {
        return relacionEspeciesFactoresPantalla;
    }
    
    public void suscribirEscucha(TableModelListener escucha){
        tablaProductos.getModel().addTableModelListener(escucha);
        tablaEspecies.getModel().addTableModelListener(escucha);
    }
    
    public void setRelacionProductosFactores(Hashtable relacion){
        if(relacion.size()>0){
            equalsToCopy(this.relacionProductosFactores, (Hashtable) relacion,"Productos");
            ((ModeloTablaPAFC)tablaProductos.getModel()).setRelacionFactores( relacion );
            
            this.wizzard.setRelacionProductosFactores(relacion);
        }
    }
    
    public Hashtable getRelacionProductosFactores(){
        return ((ModeloTablaPAFC)tablaProductos.getModel()).getRelacionFactores();
    }
    
    public void setRelacionEspeciesFactores(Hashtable relacion){
        if(relacion.size()>0){
            equalsToCopy(this.relacionEspeciesFactores, (Hashtable) relacion,"Especies");
            ((ModeloTablaPAFC)tablaEspecies.getModel()).setRelacionFactores( relacion );
            tablaEspecies.updateUI();
        }
    }
    
    public Hashtable getRelacionEspeciesFactores(){
        return ((ModeloTablaPAFC)tablaEspecies.getModel()).getRelacionFactores();
        //return relacionEspeciesFactores;
    }
    
    public void setValorPorDefecto(TasaPK valorPorDefecto) {
        ((ModeloTablaPAFC)tablaEspecies.getModel()).setValorPorDefecto(valorPorDefecto);
    }
    
    public void salir() throws Exception {
//        this.origenEspecies.closePoolConnection();
        /*for (Object elem : origenesdatsoOK) {
            ((OrigenDeDatos)elem).closePoolConnection();
        }*/
//        this.origenLibrosCuentas.closePoolConnection();
//        this.origenTasa.closePoolConnection();
    }
    
    private Object[][] object=null;
    void setDataUpdate(Object[][] object) {
        this.object=object;
    }
    
    private List keyAdd = new ArrayList();
    public List getKeyAdd(){
        return keyAdd;
    }
    /**
     *Compara dos hashtable si en el htfuente existe algun elemento que no existe en el htdestino
     *lo copia
     */
    private void equalsToCopy(Hashtable htfuente,Hashtable htdestino,String quien){
//        Double g=5.0;
//        g.intValue();        
        Enumeration enumeration=htfuente.keys();
        Hashtable httmp=new Hashtable();
        while(enumeration.hasMoreElements()){
            Object key=enumeration.nextElement();
            if(!htdestino.containsKey(key)){
                if(object==null)
                    httmp.put(key,htfuente.get(key));
                else if(object!=null && object.length>0){
                    for (int i = 0; i < object.length; i++){
                        if(object[i][0].equals(key) && ((Boolean)object[i][2])){
                            keyAdd.add(key.toString());
                            htdestino.put(key,htfuente.get(key));
                            break;
                        }
                    }
                }
            }
        }
        if(httmp.size()>0){
            object=null;
            new DAdicionarEspecies(getFrame(),httmp,this,quien);
            if(this.object.length>0){
                //keyAdd = new ArrayList();
                equalsToCopy(htfuente,htdestino,quien);
            }
        }
        object=null;
    }
    private ejb.metrica.matriz.correlacion.MatrizCorrelacionSBBean lookupMatrizCorrelacionSBBean() {
        return new MatrizCorrelacionSBBean();
        /*try {
            Properties prop = new Properties();
            prop.put( Context.INITIAL_CONTEXT_FACTORY, ig.util.ejb.IGBean.INITIAL_CONTEXT_FACTORY);
            String Sockec = new ig.util.ConexionServer().getSocketServer();
            prop.put( Context.PROVIDER_URL, Sockec);
            
            javax.naming.Context c = new javax.naming.InitialContext(prop);
            Object remote = c.lookup("MatrizCorrelacionSBBean");
            ejb.metrica.matriz.correlacion.MatrizCorrelacionSBRemoteHome rv = (ejb.metrica.matriz.correlacion.MatrizCorrelacionSBRemoteHome) javax.rmi.PortableRemoteObject.narrow(remote, ejb.metrica.matriz.correlacion.MatrizCorrelacionSBRemoteHome.class);
            return rv.create();
        } catch(javax.naming.NamingException ne) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ne);
            throw new RuntimeException(ne);
        } catch(javax.ejb.CreateException ce) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ce);
            throw new RuntimeException(ce);
        } catch(java.rmi.RemoteException re) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,re);
            throw new RuntimeException(re);
        }*/
    }
}